import axios from "axios";
import {ElMessage, ElMessageBox} from "element-plus";
import Cookies from 'js-cookie'
const server = axios.create({
    baseURL: "http://localhost:7000",
    timeout: 30000,
    headers: {
        "Content-Type": "application/json"
    }
});
server.interceptors.request.use(config => {
    config.headers["Authorization"] = getToken();
    //判断是否需要防止数据重复提交

    //当前请求的对象
    const requestObj = {
        url: config.url,
        data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
        time: new Date().getTime()
    }
    //判断请求数据大小，太大没办法存进session
    const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
    const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
    if (requestSize >= limitSize) {
        console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制，无法进行防重复提交验证。')
        return config;
    }
    //将json格式的字符串转换成对象
    const sessionObj = JSON.parse(sessionStorage.getItem('sessionObj'));
    if (sessionObj === undefined || sessionObj === null || sessionObj === '') {
        //session里面只能存字符串，所以要把对象转成字符串
        sessionStorage.setItem('sessionObj', JSON.stringify(requestObj))
    } else {
        const s_url = sessionObj.url;                  // 请求地址
        const s_data = sessionObj.data;                // 请求数据
        const s_time = sessionObj.time;                // 请求时间
        const interval = 1000;                         // 间隔时间(ms)，小于此时间视为重复提交
        if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) {
            const message1 = '请勿重复提交';
            const res={
                data:{
                    code:601,
                    message:message1,
                    data:null,
                }
            }
            console.warn(`[${s_url}]: ` + JSON.stringify(res))
            return Promise.reject(res)
        } else {
            sessionStorage.setItem('sessionObj', JSON.stringify(requestObj))
        }
    }
    //注意这里一定要返回config
    return config;
})
// 响应拦截器
server.interceptors.response.use(res => {
        console.log("拦截,",res)
        if (res.headers['authorization']) {
            Cookies.set('token', res.headers['authorization'],{expires: 1});
        }
        if(res.data==null) {
            return res
        }
        // 未设置状态码则默认成功状态
        const code = res.data.code || 200;
        // 获取错误信息
        const msg = res.data.msg || '未知错误';
        // 二进制数据则直接返回
        if (res.request.responseType === 'blob' || res.request.responseType === 'arraybuffer') {
            return res.data
        }
        if(!code||!msg){
            ElMessage({message: '无返回信息', type: 'error'})
        }
        if (code === 401) {
            ElMessageBox.confirm('登录状态已过期，您可以继续留在该页面，或者重新登录', '系统提示', {
                confirmButtonText: '重新登录',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                store.dispatch('LogOut').then(() => {
                    location.href = '/index';
                })
            });
            return Promise.reject('无效的会话，或者会话已过期，请重新登录。')
        } else if (code === 500) {
            ElMessage({message: msg, type: 'error'})
            return Promise.reject(new Error(msg))
        } else if (code === 601) {
            ElMessage({message: msg, type: 'warning'})
            return Promise.reject('error')
        } else if(code === 400){
            return res.data
        }
        else if (code !== 200) {
            ElMessage({message: msg, type: 'error'})
            return Promise.reject('error')
        } else {

            return res.data
        }
    },
    error => {
        let {message} = error;
        if(error.data.code === 401){
            message = error.response.data.message;
        }
        if(error.data.code === 403){
            message = "无权限访问";
        }
        if(error.data.code === 404){
            message = "请求资源不存在";
        }
        if(error.data.code === 500){
            message = "没有该用户";
        }
        ElMessage({message: message, type: 'error', duration: 5 * 1000})
        return Promise.reject(error)
    }
)

function getToken() {

    return Cookies.get("token")
}

export default server
